package vistas;

import java.util.*;
import java.util.regex.Pattern;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.*;

import javax.swing.*;

import api.API;
import api.Dispositivo;
import api.ControlDispositivos;
import interfaces.Notificador;

@SuppressWarnings("serial")
public class VistaAgregarDispositivo extends JFrame implements MouseListener,ActionListener {
	
	@SuppressWarnings("rawtypes")
	private List<Class> dispositivosDisponibles;
	private String dominio = "dominioEdificio";
	private PlanoEdificio plano;
	
	private Dispositivo dispositivoAgregado;
	private int clickX;
	private int clickY;
	
	private Container container;
	private GridBagConstraints csVista = new GridBagConstraints();	
		
	// Seleccion de dispositivos disponibles
	private DefaultComboBoxModel modelDispDisponibles;
	private JComboBox dispDisponibles;
	private JLabel lblDispositivos;
	
	// ID de dispositivos
	private JTextField txtNombre;
	private JLabel lblNombre;
	private String piso;
	
	// Imagen
	private JTextField txtNombreImagen;
	private JLabel lblImagen;
	private JButton buttExaminar; 
	
	//Botones generales
	private JButton buttAceptar;
	private JButton buttCancelar;
	private JButton buttActualizar;
	
	//FileChooser
	private JFileChooser fileChooser;
	
	private int sizeW = 600;
	private int sizeH = 150;
	
	public VistaAgregarDispositivo(){
		super("VistaAgregarDispositivo");				
		this.setContainer();		
	}
	
	public void setContainer(){		
		container = new Container();
		this.container.setLayout(new GridBagLayout());		
		
		this.lblDispositivos = new JLabel();
		this.lblDispositivos.setText("Dispositivos");
		this.modelDispDisponibles = new DefaultComboBoxModel();
		this.dispDisponibles = new JComboBox(this.modelDispDisponibles);
		this.getDispositivosDisponibles();
		
		this.lblNombre = new JLabel("Nombre");
		this.txtNombre = new JTextField();		
		
		this.lblImagen = new JLabel("Archivo de Imagen");
		this.txtNombreImagen = new JTextField();
						
		this.setCsVista(0,0,1,1,0.0,0.0,GridBagConstraints.NONE,GridBagConstraints.CENTER);		
		this.container.add(this.lblDispositivos,csVista);
		this.setCsVista(0,1,1,1,0.0,0.0,GridBagConstraints.NONE,GridBagConstraints.CENTER);		
		this.container.add(this.dispDisponibles,csVista);
		
		this.setCsVista(1,0,1,1,0.0,0.0,GridBagConstraints.NONE,GridBagConstraints.CENTER);		
		this.container.add(this.lblNombre,csVista);
		this.setCsVista(1,1,1,1,0.5,0.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);		
		this.container.add(this.txtNombre,csVista);
						
		this.setCsVista(2,0,1,1,0.0,0.0,GridBagConstraints.NONE,GridBagConstraints.CENTER);		
		this.container.add(this.lblImagen,csVista);
		this.setCsVista(2,1,1,1,0.0,0.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);		
		this.container.add(this.txtNombreImagen,csVista);
		this.setCsVista(3,1,1,1,0.0,0.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);		
		this.container.add(this.getButtExaminar(),csVista);
		
		this.setCsVista(0,2,1,1,0.0,0.0,GridBagConstraints.CENTER,GridBagConstraints.CENTER);		
		this.container.add(this.getButtActualizar(),csVista);
		this.setCsVista(0,2,2,1,0.0,0.0,GridBagConstraints.CENTER,GridBagConstraints.CENTER);		
		this.container.add(this.getButtAceptar(),csVista);
		this.setCsVista(1,2,2,1,0.0,0.0,GridBagConstraints.CENTER,GridBagConstraints.CENTER);
		this.container.add(this.getButtCancelar(),csVista);
		
		this.setContentPane(container);
		this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);					
		this.pack();
		this.setSize(this.sizeW, this.sizeH);		
	}
	
	public void setNombreImagen(String texto){
		this.txtNombreImagen.setText(texto);
		this.repaint();
	}
	
	// Para setear el ID del piso en el que se agregan los dispositivos
	public void setPiso(String piso){
		this.piso = piso;
	}
	
	public String getPiso(){
		return this.piso;
	}
	
	public void setClickXY(int x, int y){
		this.clickX = x;
		this.clickY = y;
	}
	
	public void setPlano(PlanoEdificio plano){
		this.plano = plano;
	}
	
	private void setCsVista(int x, int y, int cantCeldas, int cantLineas, double largoCelda, double altoCelda, int fill, int anchor){
		this.csVista.gridx = x;
		this.csVista.gridy = y;
		this.csVista.gridwidth = cantCeldas;
		this.csVista.gridheight = cantLineas;
		this.csVista.weightx = largoCelda;
		this.csVista.weighty = altoCelda;
		this.csVista.fill = fill;
		this.csVista.anchor = anchor;
	}
	
	private JButton getButtAceptar(){
		if (this.buttAceptar == null) {
			this.buttAceptar = new JButton("Aceptar");
			this.buttAceptar.addMouseListener(this);
		}		
		return this.buttAceptar;
	}
	
	private JButton getButtCancelar(){
		if (this.buttCancelar == null) {
			this.buttCancelar = new JButton("Cancelar");
			this.buttCancelar.addMouseListener(this);
		}		
		return this.buttCancelar;
	}
	
	private JButton getButtExaminar(){
		if (this.buttExaminar == null){
			this.buttExaminar = new JButton("Examinar");
			this.buttExaminar.addMouseListener(this);
		}
		return this.buttExaminar;
	}
	
	private JButton getButtActualizar(){
		if (this.buttActualizar == null){
			this.buttActualizar = new JButton("Actualizar");
			this.buttActualizar.addMouseListener(this);
		}
		return this.buttActualizar;
	}
	
	private void getDispositivosDisponibles(){
		if (this.dispDisponibles.getComponentCount() > 0) this.dispDisponibles.removeAllItems();
		this.dispositivosDisponibles = ControlDispositivos.obtenerInstancia().getDispositivosDisponibles(this.dominio);		
		@SuppressWarnings("rawtypes")
		Iterator<Class> itDispDisponibles = dispositivosDisponibles.iterator();
		while (itDispDisponibles.hasNext()){
			this.dispDisponibles.addItem(itDispDisponibles.next().getSimpleName());
		}		
	}	
	
	public void mouseClicked(MouseEvent arg0) {		
		String nombre = arg0.getComponent().getAccessibleContext().getAccessibleName();		
		if (nombre.compareTo(this.buttCancelar.getText()) ==  0) {
			this.setVisible(false);
			this.limpiar();
		}
		else if (nombre.compareTo(this.buttAceptar.getText()) ==  0) {
			if ((Pattern.matches("[a-z|A-Z|0-9]*",this.txtNombre.getText())) && 
				(Pattern.matches("[a-z|A-Z|0-9]*",this.dispDisponibles.getSelectedItem().toString()))){
				try {
					String path = "dominioEdificio."+this.dispDisponibles.getSelectedItem().toString();
					@SuppressWarnings("rawtypes")
					Class clase = Class.forName(path);
					Notificador notificador = (Notificador)clase.newInstance();
					API.obtenerInstancia().registrarNotificador(notificador);
					this.dispositivoAgregado = new Dispositivo(this.txtNombre.getText(),this.getPiso(),this.txtNombreImagen.getText(),notificador );
					this.dispositivoAgregado.setCoordenadas(this.clickX, this.clickY);
					this.dispositivoAgregado.setPiso(this.piso);
					this.dispositivoAgregado.setPathImagen(this.txtNombreImagen.getText());
					ControlDispositivos.obtenerInstancia().agregarDispositivoEdificio(this.dispositivoAgregado);
					this.plano.agregarDispositivo(this.dispositivoAgregado);
					this.setVisible(false);
					this.limpiar();
				} catch (InstantiationException e) {					
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (ClassNotFoundException e){
					e.printStackTrace();
				}				
			}			
		}
		else if (nombre.compareTo(this.buttExaminar.getText()) ==  0) {
			this.fileChooser = new JFileChooser();
			int resultado = this.fileChooser.showOpenDialog(this);
			if (resultado == JFileChooser.APPROVE_OPTION) {
				this.txtNombreImagen.setText(this.fileChooser.getSelectedFile().getAbsolutePath());
			}
		}
		else if (nombre.compareTo(this.buttActualizar.getText()) ==  0) {
			this.getDispositivosDisponibles();
		}	
	}
	public void actionPerformed(ActionEvent arg0) {}
	public void mouseEntered(MouseEvent arg0) {}
	public void mouseExited(MouseEvent arg0) {}
	public void mousePressed(MouseEvent arg0) {}
	public void mouseReleased(MouseEvent arg0) {}
	
	private void limpiar(){
		this.txtNombre.setText("");
		this.txtNombreImagen.setText("");
	}
}
